Accessibilité et Potentiel

Author

Claude Grasland

INTRODUCTION

Objectifs

Cette séance va permettre :

  • de consolider les apprentissages en matière de cartographie et d’analyse spatiale.

  • d’aborder de nouvelles données sous l’angle des problèmes de localisation optimale, dans une perspective soit de service public (e.g. localisation optimale des écoles ou des crèches), soit de concurrence spatiale (localisation d’un commerce maximisant la clientète).

  • de créer des fonctions-type de cartographie et d’analye spatiale pouvant être mobilisées ensuite dans vos applications shiny interactives.

Chargement des packages

L’installation est a priori la même que dans les sessions précédentes.cOn reprend juste pour mémoire la liste, à l’intention de ceux qui n’auraient pas suivi la séance précédente :

library(knitr)
library(dplyr)

library(sf)
library(mapsf)
library(RColorBrewer)
library(leaflet)

library(ggplot2)
library(plotly)

DONNEES

On dispose de cinq jeux de données sur Paris et les départements de Petite Couronne qui ont été téléchargés sur le site de l’INSEE ou du ministère des sports et légèrement retouchés pour en faciliter l’utilisation.

Contour des communes d’Ile de France

Ce fichier fournit le contour des communes de Paris et petite Couronne. On commence par vérifier le système de projection :

mapcom<-readRDS("ParisPC/mapcom_parisPC.RDS")
st_crs(mapcom)
Coordinate Reference System:
  User input: 4326 
  wkt:
GEOGCS["WGS 84",
      DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
          AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
      PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
      UNIT["degree",0.0174532925199433,
        AUTHORITY["EPSG","9122"]],
      AXIS["Latitude",NORTH],
      AXIS["Longitude",EAST],
    AUTHORITY["EPSG","4326"]]

Le système de projection EPSG = 4326 est celui qui convient pour leaflet. On peut visualiser l’ensemble des commune facilement :

leaflet() %>%  addTiles() %>%
              addPolygons(data=mapcom, # fonds de carte 4326
                          weight = 1,  # épaisseur des traits
                          col = "red", # couleur
                          label = ~nom_com, # réaction souris
                          opacity = 0.3)  # opacité du remplissage

Revenus, pauvreté et niveau de vie en 2015 - Données carroyées

Ces données issues du “Dispositif Fichier localisé social et fiscal” (Filosofi) ont été créée pour des besoins de services public :

L’Insee fournit des informations socio-économiques sur près de 30 millions de ménages. Il diffuse ces informations à différentes échelles dont la plus petite est celle d’un carreau de 200 mètres de côté.

Ces statistiques locales permettent d’observer finement la situation socio-économique de la population de zones géographiques très ciblées. Elles représentent une source d’information précieuse pour aller au-devant des besoins des habitants et des acteurs économiques et accompagner la mise en œuvre de politiques publiques.

Source : INSEE

Examinons à titre d’exemple les carreaux correspondant majoritairement au territoire de la commune de Sucy-en-Brie (code = 94071)

gridpop<-readRDS("ParisPC/gridpop_parisPC.RDS")



leaflet() %>%  addTiles() %>%
                addPolygons(data=mapcom, 
                          weight = 1,
                          col = "blue",
                          fillOpacity = 0.1) %>%
  
              addPolygons(data=gridpop, 
                          weight = 1,
                          col = "red", 
                          opacity = 0.3) 

Comme on peut le voir, les carreaux ne sont présent que dans les zones peuplées et ne recouvrent pas les zones inhabitées.

Le fichier propose un grand nombre de variables dont on trouvera la description dans le document explicatif dictionnaire des variables accessible sur le site de l’INSEE

kable(head(st_drop_geometry(gridpop))[,1:10])
insee_com I_pauv Ind Men Men_pauv Men_1ind Men_5ind Men_prop Men_fmp Ind_snv
75119 0 2818.5 990 280 340 164 21 159 44265483
75111 0 1543.5 926 128 564 20 378 57 48209885
75119 0 1338.0 508 131 185 71 124 54 24681173
75119 0 1235.5 633 76 319 33 352 32 41531046
75120 0 685.0 349 134 201 22 46 28 12379153
75113 0 1728.0 751 115 311 63 177 106 43383686

Pour des raisons de confidentialités, les données ne peuvent toutefois être divulguées lorsqu’il y a moins de 10 à 20 ménages dans un carreau de la grille. Dans ce cas, les données sont “modifiées” en effectuant une sorte de moyenne avec les carreaux les plus proches.

Base des équipements sportifs

Cette base de données du ministère de l’équipement et des sports est accessible par ce lien. Elle fournit la position précise des équipements sportifs en indiquant leur type, leur ancienneté, leur accessibilité aux handicapés, etc. Nous avons réalisé une extraction pour les départements de Paris et petite couronne en ne retenant que quelques indicateurs.

equ<-readRDS("ParisPC/equip_ParisPC.RDS") 
kable(head(equ))
insee_com typ_code typ_nom typ_fam dat_ser prop lon lat geometry
75119 1205 Practice Parcours de golf 2009 Commune 2.38027 48.88630 POINT (2.38027 48.8863)
75119 802 Salle de musculation/cardiotraining Equipement d’activités de forme et de santé NA Etablissement privé commercial 2.38049 48.89280 POINT (2.38049 48.8928)
75119 2105 Salle de danse Salle ou terrain spécialisé 1997 Etablissement privé commercial 2.37923 48.89400 POINT (2.37923 48.894)
75119 801 Salle de cours collectifs Equipement d’activités de forme et de santé 2007 Privé non commercial 2.37056 48.87941 POINT (2.37056 48.87941)
75119 104 Fosse à plongeon Bassin de natation 1972 Commune 2.38911 48.88210 POINT (2.38911 48.8821)
75119 1701 Multisports/City-stades Multisports/City-stades 2005 Commune 2.38669 48.87640 POINT (2.38669 48.8764)

On peut voir que le fichier comporte 109 équipements, certains étant rares et d’autres fréquents.

tab<-equ %>% st_drop_geometry() %>%
                count(typ_code,typ_nom) %>%
                arrange(-n)
kable(head(tab,25))
typ_code typ_nom n
501 Court de tennis 1991
1901 Salle multisports (gymnase) 1339
1701 Multisports/City-stades 1063
802 Salle de musculation/cardiotraining 821
2802 Terrain de football 680
2105 Salle de danse 584
1801 Dojo / Salle d’arts martiaux 478
2201 Salles polyvalentes / des fêtes / non spécialisées 462
801 Salle de cours collectifs 415
202 Terrain de pétanque 374
2901 Terrain de basket-ball 364
1004 Piste d’athlétisme isolée 219
102 Bassin sportif de natation 212
2701 Structure Artificielle d’Escalade 196
2106 Salle de gymnastique sportive 175
1001 Stade d’athlétisme 148
2111 Salle de tennis de table 148
103 Bassin ludique de natation 146
2117 Salle ou terrain de squash 142
1105 Mur de tennis 122
2903 Terrain de handball 119
1802 Salle de boxe 114
1401 Pas de tir à l’arc 112
2803 Terrain de rugby 109
1003 Aire de saut 96

Examinons à titre d’exemple la localisation des terrains de football (code 2802) autour de la commeune de Sucy-en-Brie (code 94071)

myequ<-equ %>% filter(typ_code %in% c("2803"))
leaflet() %>% addProviderTiles('Esri.WorldTopoMap') %>%
  
                addPolygons(data=mapcom, 
                          weight = 1,
                          col = "blue",
                          fillOpacity = 0.1) %>%
  
              addCircleMarkers(data=myequ,
                               radius = 3,
                               stroke = T,
                               weight = 2,
                               color="red",
                               fillColor =  "yellow")

Exercice : Faites une carte de la distribution de votre équipement.

ACCESSIBILITE

Nous allons calculer l’accessibilité de la population de Sucy-en-Brie aux terrains de football localisés à l’intérieur de ses frontières.

Préparation des données

On extrait les contours de la commune choisie et sa population sur grille puis on projette les deux cartes dans la projection Lambert (crs=2154) afin de pouvoir mesurer les distances à vol d’oiseau en km. On calcule le centre des grilles pour positionner les populations.

mymap <- mapcom %>% filter(insee_com=="94071") %>% 
                        st_transform(2154)

mypop <- gridpop %>% filter(insee_com== "94071") %>%
                     select(w = "Ind") %>%
                     st_transform(2154)

On extrait ensuite les équipements qui nous intéressent en ne retenant dans un premier temps que ceux qui sont présents dans la commune :

myequ <- equ %>% filter(typ_code==2802,
                        insee_com == "94071") %>%
                  mutate(w=1) %>%
                  select(w) %>%
                  st_transform(2154)

On vérifie à l’aide d’une carte que tout se superpose bien :

# carte de base de type polygone
mf_map(mymap, type="base", 
       col="lightyellow")

# Carte de stock
mf_map(mypop, type="prop",
       var="w",
       inches=0.05,           # réglage de la taille dez symboles
       symbol = "square",     # forme des symboles
       col="red",              
       leg_pos = "topright",       # position de la légende
       leg_title = "Population")    # Titre de la légende


# Carte de base de type point
mf_map(myequ, type="base",
       pch=20,
       col="black",
       leg_pos = "topleft",
       leg_title = "Equipement",
       add=T)                    # Superposition sur les cartes précédentes

# Titre, cadre, échelle, source ...
mf_layout(title = "Population et ressources",
          scale = T, 
          frame=T,
          arrow=F,
          credits = "Source : INSEE et Min. Sports, 2024"
          )

Calcul de la distance Population x Ressource

Le calcul va être effectué par la fonction st_distance() du package sf. Elle ne fonctionne que si le fonds de carte a été projetée, ce que nous avons fait avant. On la transforme en numérique puis en matrice et on calcule pour chaque point de population sa distance minimum à l’équipement choisi en mètres

D <-st_distance(mypop, myequ, by_element = F) 
class(D)<-"matrix"
D[1:3,1:5]
         [,1]     [,2]     [,3]     [,4]     [,5]
[1,] 3855.405 3971.156 1465.316 4122.109 4060.326
[2,] 1787.188 1936.501 1319.309 2055.465 1989.679
[3,] 2163.856 2321.926 1346.151 2430.599 2363.762

Calcul de la distance minimum

On calcule pour chaque point de la grille population sa distance minimale à l’équipement et on effectue la moyenne pondérée :

mypop$Dmin <- apply(D,1,min)
Dmintot <- sum(mypop$Dmin*mypop$w)/sum(mypop$w)
Dmintot
[1] 837.692

On constate que les habitants de la commune sont en moyenne à 837.6 mètres de l’équipement le plus proche.

Courbe d’accessibilité minimale de la population

Une solution plus générale consiste à calculer une courbe de fréquence cumulée indiquant combien d’habitants sont situés à moins d’une certaine distance de l’équipement.

tabfreq<-data.frame(dis= mypop$Dmin, pop = mypop$w) %>% 
              arrange(dis) %>%
              mutate(cumpop=cumsum(pop)) %>%
              mutate(cumfreq=100*cumpop/sum(pop))
head(tabfreq)
       dis   pop cumpop   cumfreq
1  0.00000   3.0    3.0 0.0112049
2  0.00000  21.0   24.0 0.0896392
3  0.00000 118.0  142.0 0.5303653
4  0.00000   3.0  145.0 0.5415702
5 59.90465 443.5  588.5 2.1980279
6 71.12526 181.0  769.5 2.8740569

On voit ainsi par exemple que 769 habitants sont situés à moins de 178 mètres de l’équipement ce qui représente 2.87% de la population de la commune. On trace le résultat avec ggplot2 :

p<-ggplot(tabfreq) + aes(x=dis, y=cumfreq) +
                     geom_line() +
                     scale_x_continuous(name = "Distance minimale à l'équipement") +
                     scale_y_continuous(name = "% de la population") +
                     ggtitle("Courbe d'accessibilité minimale")
ggplotly(p)

On peut alors voir en promenant le curseur sur la courbe quel % de la poplation se trouve à moins d’une certaine distance de l’équipement le plus proche et répondre aux questions telles que :

  • Q1 : quel % de la population est située à moins de 500 m ? environ 26%
  • Q2 : quel % de la population est située à plus de 1500 m ? environ 4%
  • Q3 : A quelle distance se trouvent les 10% les plus favorisés ? moins de 258 m
  • Q4 : A quelle distance se trouvent les 10% les moins favorisés ? plus de 1371m
  • Q5 : quelle est la distance médiane à l’équipement le plus proche ? 900 m

Cartographie

On peut faire une carte représentant la localisation et l’effectif des populations favorisés et défavorisés. On va utiliser pour cela des carrés dont la surface sera proportionnlle à la population et la couleur à l’accessibilité minimale à l’équipement le plus proche. On utilisera comme seuil cartographique de référence la distance moyenne et ses valeurs divisées par deux ou multipliées par deux.

mf_map(mymap, type="base", 
       col="lightyellow")


mybreaks<-c(min(mypop$Dmin), Dmintot/2, Dmintot, Dmintot*2, max(mypop$Dmin))
mypal<-rev(brewer.pal(4,"RdYlBu"))

mf_map(mypop, type="prop_choro",
       var=c("w", "Dmin"),
       inches=0.05,
       pal=mypal,
       breaks=mybreaks,
       symbol = "square",
       leg_pos = c("topleft","topright"),
       leg_title = c("Population", "Distance minimale (en m)"),
       leg_val_rnd = c(0,0)
        )

mf_map(myequ, type="base",
       pch=20,
       col="black",
       leg_pos = "topleft",
       leg_title = "Equipement",
       add=T)
mf_layout(title = "Accessibilité de la population à la ressource",
          scale = T, 
          frame=T,
          arrow=F,
          credits = "Source : INSEE et Min. Sports, 2024"
          )

Exercice : refaire les calculs précédents pour tout le Grand Paris

## Chargement des fichiers
mymap <- mapcom %>%  st_transform(2154)

mypop <- gridpop %>%  select(w = "Ind") %>%
                     st_transform(2154)

myequ <- equ %>% filter(typ_code==2802) %>%
                  mutate(w=1) %>%
                  select(w) %>%
                  st_transform(2154)

## Calcul de la matrice de distance
D <-st_distance(mypop, myequ, by_element = F) 
class(D)<-"matrix"
D[1:3,1:5]
         [,1]      [,2]     [,3]     [,4]     [,5]
[1,] 5253.313  352.0405 4367.758 6420.792 6979.968
[2,] 3212.081 3890.0556 2882.108 3799.088 3930.807
[3,] 5580.766  906.8593 4756.769 6655.044 7102.999
## Calcul de la distance minimale moyenne
mypop$Dmin <- apply(D,1,min)
Dmintot <- sum(mypop$Dmin*mypop$w)/sum(mypop$w)
Dmintot
[1] 750.3469
## Tableau de distance cumulée
tabfreq<-data.frame(dis= mypop$Dmin, pop = mypop$w) %>% 
              arrange(dis) %>%
              mutate(cumpop=cumsum(pop)) %>%
              mutate(cumfreq=100*cumpop/sum(pop))
head(tabfreq)
  dis   pop cumpop     cumfreq
1   0 243.0  243.0 0.003653544
2   0 140.0  383.0 0.005758467
3   0   5.0  388.0 0.005833643
4   0 563.5  951.5 0.014305957
5   0  94.0 1045.5 0.015719262
6   0   7.5 1053.0 0.015832026
## Graphique d'accessibilité
p<-ggplot(tabfreq) + aes(x=dis, y=cumfreq) +
                     geom_line() +
                     scale_x_continuous(name = "Distance minimale à l'équipement") +
                     scale_y_continuous(name = "% de la population") +
                     ggtitle("Courbe d'accessibilité minimale")
ggplotly(p)
## Carte d'accessibilité

mf_map(mymap, type="base", 
       col="lightyellow")


mybreaks<-c(min(mypop$Dmin), Dmintot/2, Dmintot, Dmintot*2, max(mypop$Dmin))
mypal<-rev(brewer.pal(4,"RdYlBu"))

mf_map(mypop, type="prop_choro",
       var=c("w", "Dmin"),
       inches=0.05,
       pal=mypal,
       border = NA,
       breaks=mybreaks,
       symbol = "square",
       leg_pos = c("topleft","topright"),
       leg_title = c("Population", "Distance minimale (en m)"),
       leg_val_rnd = c(0,0)
        )

mf_map(myequ, type="base",
       pch=20,
       cex=0.2,
       col="black",
       leg_pos = "topleft",
       leg_title = "Equipement",
       add=T)
mf_layout(title = "Accessibilité de la population aux terrain de football le plus proche ",
          scale = T, 
          frame=T,
          arrow=F,
          credits = "Source : INSEE et Min. Sports, 2024"
          )

POTENTIEL

On repart de la matrice des distances mais on va calculer cette fois-ci le nombre d’équipement situés à moins d’une certaine distance du lieu d’habitat. On va utiliser cette fois-ci les centres de commune comme point de référence :

Préparation des données

mycom <- mapcom %>% st_transform(2154)
myequ <- equ %>% filter(typ_code==2802) %>%
                  st_transform(2154)

Distance

matdis <-st_distance(mycom,myequ)
matdis<-as.matrix(matdis)
class(matdis)<-"matrix"
row.names(matdis)<-mycom$insee_com
matdis[1:5,1:7]
           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
75119  2923.439     0.000  1984.378  4149.837  4732.112  6842.183  6240.701
75106  5101.953  5582.947  5044.986  5181.630  4750.000  8941.392  8257.951
93071 11199.722 10019.160 10589.325 12318.792 13406.187 11929.699 11836.841
94056 19504.036 25241.280 20382.510 18446.918 18215.258 15436.621 16011.799
94041  3376.855  8172.080  4180.139  2185.553  1107.208  3733.509  3302.157

Calcul du nombre d’équipement à moins de 1000 m

On transforme la matrice en 0 ou 1 selon la distance

mat2000 <- matdis<1000
mycom$pot2000<-apply(mat2000,1,sum)

Cartographie du résultat

mf_map(mycom, type = "choro",
       var="pot2000",
       breaks=c(0,5,10,15,20,25,30,max(mycom$pot2000)),
       leg_pos = "topright",
       leg_title = "nb. equipt < 1000 m",
       leg_val_rnd = 0)

mf_map(myequ, type="base",
       pch=20,
       cex=0.4,
       col="red",

       add=TRUE)

mf_layout(title= "Potentiel d'équipement",
          frame=T,
          credits = "Source : INSEE & Min. des Sports")

PROLONGEMENTS

Nous avons été très rapide sur la notion de potentiel. Les personnes intéressées pour en savoir plus pourront lire en premier la vignette du Package R potential qui résume de façon rapide les principes du calcul de potentiel et décrivent les fonctions à mettre en oeuvre sous R pour réaliser une carte de potentiel.

Pour une compréhension plus approfondie du concept, on pourra se reporter aux articles de Grasland, 1990 ou de Grasland & al., 1993 qui ont profondément renouveler les méthodes de calcul du potentiel par rapport à la formulation initiale de J.Q. Stewart, 1947 qui était inspirée des lois de la gravitation universelle.